/*
 * Invocateur.cpp
 *
 *  Created on: 21 dec. 2012
 *      Author: guegan
 */

#include "Invocateur.h"
#include "CommandeRobot.h"
#include "CommandeAvancer.h"
#include "CommandeTourner.h"
#include "CommandeSaisir.h"
#include "CommandeRencontrer.h"
#include "CommandePoser.h"
#include "CommandePeser.h"
#include "CommandeEvaluer.h"
#include "CommandeFiger.h"
#include "CommandeRepartir.h"
#include <sstream>

#include "AfficheurEnConsole.h"


Invocateur::Invocateur(string chemin, Robot* bot) {
	fichier.open(chemin.c_str(), ifstream::in);
	Commande::setInvocateur(this);
	CommandeRobot::setRobot(bot);
	CommandeAvancer::getInstance();
	CommandeTourner::getInstance();
	CommandeSaisir::getInstance();
	CommandeRencontrer::getInstance();
	CommandePoser::getInstance();
	CommandePeser::getInstance();
	CommandeEvaluer::getInstance();
	CommandeFiger::getInstance();
	CommandeRepartir::getInstance();
}

void Invocateur::analyser() {
	string ligne;
	vector<string> tokens;
	string buf;
    stringstream ss;
	Commande* com = NULL;
	
	cout << "Analyse des commandes : " << endl << endl;
	if (fichier) {
		while (fichier.good()) {
			getline(fichier, ligne);
			ss.clear();
			ss << ligne;
			while (ss >> buf) {
				tokens.push_back(buf);
			}
			
			args = tokens;
			com = Commande::nouvelleCommande(tokens[0]);
			if (com != NULL) {
				commandes.push_back(com);
				cout << "Commande " << tokens[0] << " créée" << endl;
			}
			
			com = NULL;
			tokens.clear();
		}
	}
	fichier.close();

	cout << endl << "Analyse Finie"<< endl;
}

void Invocateur::executer() {
	cout << "Execution des commandes : " << endl << endl;
	for (unsigned int i=0; i < commandes.size(); i++) {
		commandes[i]->execute();
	}
}

/*void Invocateur::nextCommande() {
	stringstream ss;
	string ligne;
	string buf;
	
	args.clear();
	
	getline(fichier, ligne);
	ss.clear();
	ss << ligne;
	while (ss >> buf) {
		args.push_back(buf);
	}
}*/


